package com.example.interceptor;

import com.example.constants.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

/**
 * 登录拦截器 - 用于校验用户是否已登录
 * 实现HandlerInterceptor接口，重写preHandle方法进行登录校验
 */
@Slf4j  // 使用Lombok的@Slf4j注解自动生成日志对象
@Component  // 将该类声明为Spring组件，由Spring容器管理
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 预处理方法 - 在控制器方法执行之前调用
     * @param request HttpServletRequest对象，包含客户端请求信息
     * @param response HttpServletResponse对象，用于向客户端发送响应
     * @param handler 被拦截的控制器方法对象
     * @return boolean 返回true表示继续执行，false表示中断执行
     * @throws Exception 可能抛出的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取当前会话，如果不存在则不创建新会话
        HttpSession session = request.getSession(false);

        // 校验会话和用户信息：会话存在且会话中包含用户信息
        if (session != null &&
                session.getAttribute(Constants.SESSION_USER_KEY) != null) {
            // 用户已登录，允许继续执行后续操作
            log.info("用户已登录，允许访问资源");
            return true;
        }

        // 用户未登录，设置HTTP状态码为401（未授权）
        response.setStatus(401);
        log.warn("用户未登录，拒绝访问资源，路径：{}", request.getRequestURI());
        // 返回false中断请求处理流程
        return false;
    }
}